package generic;

/**
 *
 * 因此，与其使用Object ，我们更喜欢暂时不指定类型， 而是稍后再决定具体使用什么类型。
 * 要达到这个目的， 需要使用类型参数，用尖括号括住，放在类名后面。然后在使用这个类的时
 * 候，再用实际的类型替换此类型参数。
 *
 * @author ChangLiang
 * @date 2021/2/1
 */
public class Holder3<T> {

    private T a;

    public Holder3(T a) {
        this.a = a;
    }

    public void set(T a) {
        this.a = a;
    }

    public T get() {
        return a;
    }

    public static void main(String[] args) {
        /**
         * 现在， 当你创建Holder3对象时，必须指明想持有什么类型的对象， 将其置于尖括号内。
         * 然后，你就只能在Holder3中存入该类型（或其子类，因为多态与泛型不冲突）
         * 的对象了。并且，在你从Holder3中取出它持有的对象时，自动地就是正确的类型。
         */
        Holder3<Automobile> h3 = new Holder3<>(new Automobile());
        Automobile a = h3.get(); // No cast needed

        // h3.set("Not an Automobile"); // Error

        // h3.set(1); // Error
    }
}
